package com.lee.rabbitmq.service.impl;

import com.lee.rabbitmq.service.ReceiveService;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 接收类
 *
 * @author Lee
 * @createDate 2021/12/17 11:06
 */
@Service("receiveService")
public class ReceiveServiceImpl implements ReceiveService {
    /** 注入Amqp的模板类，利用这个对象来发送和接收消息 **/
    @Resource
    private AmqpTemplate amqpTemplate;

    /**
     * 这里个接收不是不间断接收消息，每执行一次这个方法只能接收一次消息，如果有新消息进
     * 则不会自动接收消息,不建议使用
     */
    @Override
    public void receive() {
        String message = (String) amqpTemplate.receiveAndConvert("bootDirectQueue");
        System.out.println(message);
    }

    /**
     * 持续性监听队列
     * @param message 接收到的具体消息
     * @RabbitListener 注解用于标记当前方法是一个RabbitMQ的消息监听方法，作用是持续性的自动接收消息
     * 这个方法不需要手动调用spring会自动运行这个监听
     * 属性
     *  queues  用于指定一个已经存在的队列名，用于进行队列的监听
     * 注意:
     *  如果当前监听方法正常结束spring就会自动确认消息，如果出现异常则不会确认消息
     *  因此在消息处理时我们需要做好消息的防止重复处理工作
     * @author Lee
     * @createDate 2021/12/17 11:28
     */
    @RabbitListener(queues = {"bootDirectQueue"})
    @Override
    public void directReceive(String message) {
        System.out.println("监听器接收的消息===="+message);
    }

    /**
     * 使用fanout接收消息
     * @param message 接收到的具体消息
     * @author Lee
     * @createDate 2021/12/17 14:32
     */
    @RabbitListener(bindings = {
            //@QueueBinding 注解要完成队列和交换机的
            @QueueBinding(
                    //@Queue 创建一个队列（没有指定参数则表示创建一个随机队列)
                    value =@Queue(),
                    //创建一个交换机
                    exchange =@Exchange(name="fanoutExchange",type = "fanout"))})
    public void fanoutReceive01(String message) {
        System.out.println("fanoutReceive01监听器接收的消息===="+message);
    }
    @RabbitListener(bindings = {
            @QueueBinding(
                    value =@Queue(),
                    exchange =@Exchange(name="fanoutExchange",type = "fanout"))})
    public void fanoutReceive02(String message) {
        System.out.println("fanoutReceive02监听器接收的消息===="+message);
    }

    /**
     * 使用topic接收消息
     * @param message 接收到的具体消息
     * @author Lee
     * @createDate 2021/12/17 14:32
     */
    @RabbitListener(bindings = {
            @QueueBinding(
                    //指定队列名称
                    value =@Queue("topic01"),
                    //指定Bindingkey
                    key = "aa",
                    exchange =@Exchange(name="topicExchange",type = "topic"))})
    public void topicReceive01(String message){
        System.out.println("topic01-aa-监听器接收的消息===="+message);
    }
    @RabbitListener(bindings = {
            @QueueBinding(
                    //指定队列名称
                    value =@Queue("topic02"),
                    //指定Bindingkey
                    key = "aa.*",
                    exchange =@Exchange(name="topicExchange",type = "topic"))})
    public void topicReceive02(String message){
        System.out.println("topic02-aa.*-监听器接收的消息===="+message);
    }
    @RabbitListener(bindings = {
            @QueueBinding(
                    //指定队列名称
                    value =@Queue("topic03"),
                    //指定Bindingkey
                    key = "aa.#",
                    exchange =@Exchange(name="topicExchange",type = "topic"))})
    public void topicReceive03(String message){
        System.out.println("topic03-aa.#-监听器接收的消息===="+message);
    }
}
